#ifndef __LOCK_MGR_H__
#define __LOCK_MGR_H__

#include <stdio.h>
#include <pthread.h>

#include "userLog.h"
#include "buffer.h"

#define LOCK_NUM 5

/*****************************************************************************
    枚举类型描述：该枚举表示该数据锁目前所处的状态
    UNUSED:空闲的数据锁
    PENDING:数据已经存进数据锁，未被处理，悬挂中
*****************************************************************************/
enum PROCEDURE{UNUSED, PENDING};

/*****************************************************************************
    枚举类型描述：该枚举表示该数据锁内的数据是否被使用
    USING：该数据锁中的数据正在被使用
    FREE：该数据锁中的数据未被使用
*****************************************************************************/
enum PROCEDURE_STATUS{USING, FREE};

/*****************************************************************************
    结构体描述：数据锁结构体，在多线程中保护数据，避免访问冲突
    proce：该枚举类型表示该结构体中数据锁状态
    proce_status：该枚举类型表示该结构体中数据是否被使用
    lock_no：测试用，表示该锁的序列
    t_lock：互斥锁，保护数据
    data：该锁携带的数据
*****************************************************************************/
struct thread_lock{
    enum PROCEDURE proce;
    enum PROCEDURE_STATUS proce_status;
    unsigned char lock_no;
    pthread_mutex_t t_lock; 
    void *data;
};

/*****************************************************************************
 函数描述  :  数据锁的初始化，初始化该源文件中带的私有锁变量
 输入参数  :  
             无
 返回值    :  
             无
*****************************************************************************/
void thread_lock_init();

/*****************************************************************************
 函数描述  :  获取状态为UNUSED的数据锁，并且会将状态位置为PENGINDG，数据使用情况置为FREE
 输入参数  :  
             无
 返回值    :  
             未被使用的数据锁结构体指针
*****************************************************************************/
struct thread_lock* get_unused_lock();

/*****************************************************************************
 函数描述  :  获取状态为PENDING的数据锁，数据使用情况置为USING
 输入参数  :  
             无
 返回值    :  
             符合函数描述的数据锁结构体指针
*****************************************************************************/
struct thread_lock* get_pending_lock();

/*****************************************************************************
 函数描述  :  设置数据锁状态为PENDING，并且会将状态位置为FREE
 输入参数  :  
             lock：struct thread_lock *，需要被设置的数据锁指针
 返回值    :  
             无
*****************************************************************************/
void set_lock_pending_flag(struct thread_lock *lock);

/*****************************************************************************
 函数描述  :  设置数据锁状态为UNUSED，并且会将状态位置为FREE
 输入参数  :  
             lock：struct thread_lock *，需要被设置的数据锁指针
 返回值    :  
              无
*****************************************************************************/
void unset_lock_used_flag(struct thread_lock *lock);

#endif // !__LOCK_MGR_H__